/* 
 * ViaturaUnidadeOperacional.java
 * 
 * Data de criação: 06/09/2010
 * 
 * O2SOLUTIONS - SOLUÇÕES EM TECNOLOGIA DA INFORMAÇÃO. 
 *
 */
package br.com.o2solutions.siso.integration.entidade;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;

import br.com.o2solutions.core.integration.repository.entity.BaseEntity;

/**
 * Classe responsável por representar o objeto associativo entre a
 * {@link UnidadeOperacional} e a {@link Viatura}. Registra a data de aquisição
 * da viatura pela {@link UnidadeOperacional} assim como a data de
 * remanejamento.
 * 
 * @author Osvaldeir
 * @since 06/09/2010
 * 
 */
@Entity
@Table(name = "RLVIATURAUNIDADEOPERACIONAL", uniqueConstraints = { @UniqueConstraint(columnNames = {
		"VIATURAID", "UNIDADEOPERACIONALID", "DATAAQUISICAO",
		"DATAREMANEJAMENTO" }) })
@SequenceGenerator(name = "SQVIATURAUNIDADEOPERACIONAL", sequenceName = "SQVIATURAUNIDADEOPERACIONAL")
public class ViaturaUnidadeOperacional extends BaseEntity<Integer> {

	private static final long serialVersionUID = 1L;

	private Viatura viatura;

	private UnidadeOperacional unidadeOperacional;

	private Date dataAquisicao;

	private Date dataRemanejamento;

	/**
	 * Construtor padrão
	 */
	public ViaturaUnidadeOperacional() {
	}

	/**
	 * Construtor para criação do objeto com as vinculações de Viatura e
	 * {@link UnidadeOperacional}.
	 * 
	 * @param viatura
	 * @param unidadeOperacional
	 */
	public ViaturaUnidadeOperacional(Viatura viatura,
			UnidadeOperacional unidadeOperacional) {
		setViatura(viatura);
		setUnidadeOperacional(unidadeOperacional);
	}

	@Id
	@Override
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SQVIATURAUNIDADEOPERACIONAL")
	@Column(name="RLVIATURAUNIDADEOPERACIONALID")
	public Integer getId() {
		return super.getId();
	}

	/**
	 * Retorna o(a) viatura.
	 * 
	 * @return Viatura
	 */
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "VIATURAID", nullable = false)
	public Viatura getViatura() {
		return viatura;
	}

	/**
	 * Atribui o(a) viatura.
	 * 
	 * @param viatura
	 *            Viatura
	 */
	public void setViatura(Viatura viatura) {
		this.viatura = viatura;
	}

	/**
	 * Retorna o(a) unidadeOperacional.
	 * 
	 * @return UnidadeOperacional
	 */
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "UNIDADEOPERACIONALID", nullable = false)
	public UnidadeOperacional getUnidadeOperacional() {
		return unidadeOperacional;
	}

	/**
	 * Atribui o(a) unidadeOperacional.
	 * 
	 * @param unidadeOperacional
	 *            UnidadeOperacional
	 */
	public void setUnidadeOperacional(UnidadeOperacional unidadeOperacional) {
		this.unidadeOperacional = unidadeOperacional;
	}

	/**
	 * Retorna o(a) dataAquisicao.
	 * 
	 * @return Date
	 */
	@Temporal(TemporalType.DATE)
	@Column(name = "DATAAQUISICAO", nullable = false)
	public Date getDataAquisicao() {
		return dataAquisicao;
	}

	/**
	 * Atribui o(a) dataAquisicao.
	 * 
	 * @param dataAquisicao
	 *            Date
	 */
	public void setDataAquisicao(Date dataAquisicao) {
		this.dataAquisicao = dataAquisicao;
	}

	/**
	 * Retorna o(a) dataRemanejamento.
	 * 
	 * @return Date
	 */
	@Temporal(TemporalType.DATE)
	@Column(name = "DATAREMANEJAMENTO", nullable = true)
	public Date getDataRemanejamento() {
		return dataRemanejamento;
	}

	/**
	 * Atribui o(a) dataRemanejamento.
	 * 
	 * @param dataRemanejamento
	 *            Date
	 */
	public void setDataRemanejamento(Date dataRemanejamento) {
		this.dataRemanejamento = dataRemanejamento;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = super.hashCode();
		result = prime
				* result
				+ ((unidadeOperacional == null) ? 0 : unidadeOperacional
						.hashCode());
		result = prime * result + ((viatura == null) ? 0 : viatura.hashCode());
		return result;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (!super.equals(obj))
			return false;
		if (getClass() != obj.getClass())
			return false;
		ViaturaUnidadeOperacional other = (ViaturaUnidadeOperacional) obj;
		if (unidadeOperacional == null) {
			if (other.unidadeOperacional != null)
				return false;
		} else if (!unidadeOperacional.equals(other.unidadeOperacional))
			return false;
		if (viatura == null) {
			if (other.viatura != null)
				return false;
		} else if (!viatura.equals(other.viatura))
			return false;
		return true;
	}

}
